package com.ktjy.ktmall.service.impl;

import com.ktjy.ktmall.dao.*;
import com.ktjy.ktmall.dao.impl.*;
import com.ktjy.ktmall.entity.*;
import com.ktjy.ktmall.service.GoodsItemService;
import com.mysql.cj.util.StringUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 商品模块业务逻辑层接口实现类
 * @version v1.0
 * @Author 郴州科泰
 * @Create 2024-07-19 - 16:35
 */
public class GoodsItemServiceImpl implements GoodsItemService {
    GoodsItemDao dao = new GoodsItemDaoImpl();

    // 查询商品的分页列表数据
    @Override
    public List<GoodsItem> getGoodsListPage(Integer currPageNo, Integer pageSize) {
        Integer from = (currPageNo - 1) * pageSize;
        return dao.getGoodsListPage(from, pageSize);
    }

    // 得到总的记录数
    @Override
    public int getCount() {
        return dao.getCount();
    }

    SkuItemDao skuDao = new SkuItemDaoImpl();
    AttrValuesDao avDao = new AttrValuesDaoImpl();
    AttrItemDao attrDao = new AttrItemDaoImpl();
    BrandItemDao brandDao = new BrandItemDaoImpl();
    CategoryItemDao categoryDao = new CategoryItemDaoImpl();

    /**
     * 通过商品id查询商品的详情信息(包括详情的SKU列表、商品的规格属性等信息)
     * @param id 商品id
     * @return 返回查询到的商品详情信息
     */
    @Override
    public GoodsItem findById(int id) {
        // 1、通过商品id查询商品的基本信息
        GoodsItem goods = dao.findById(id);
        if (goods == null) return null;
        // 2、查询该商品的规格属性值列表
        List<AttrValues> attrVals = avDao.getAttrVals(goods.getId());
        // 3、根据规格属性值列表加载出所对应的规格属性列表。 比如属性值是：黄色、白色。属性是颜色
        // 3.1 根据商品id查询该商品的所有属性列表
        List<AttrItem> goodsAttr = attrDao.findAttrByGoodsId(goods.getId());
        // 3.2 遍历规格属性列表，查询出属性下的属性值列表
        goodsAttr = goodsAttr.stream().map(attr -> {
            // 3.3查询出当前属性下的属性值列表
            List<AttrValues> avList = attrVals.stream().filter(gav -> {
                return gav.getAttrId() == attr.getId(); // 过滤条件：属性值对象中的属性id == 属性对象的id
            }).collect(Collectors.toList());
            // 3.4再将属性值列表添加到attr对象的values属性中。
            attr.setValues(avList);
            return attr; // 4.5 最后再将带有属性值列表的属性对象进行返回
        }).collect(Collectors.toList());
        // 4、根据品牌id查询品牌详情信息
        BrandItem brandItem = brandDao.findById(goods.getBrandId());
        // 5、根据类别id查询类别详情信息
        CategoryItem categories = categoryDao.findById(goods.getCategoryId());
        // 6、查询该商品的SKU列表
        List<SkuItem> skuList = skuDao.findByGoodsId(goods.getId());
        // 6.1 遍历SKU列表，目的是为每个SKU获取specs规格属性列表
        skuList.stream().map(skuItem -> {
            // 6.2 查询每个SKU的属性值列表
            List<AttrValues> skuAttrVals = avDao.getSkuAttrVals(skuItem.getStockSku());
            // 6.3 查询每个SKU的属性列表
            List<AttrItem> attrs = attrDao.findAttrByStockSku(skuItem.getStockSku());
            // 6.4 遍历SKU的规格属性列表，查询出每个属性下的属性值列表
            attrs = attrs.stream().map(attr -> {
                // 6.5查询出当前属性下的属性值列表
                List<AttrValues> aVs = skuAttrVals.stream().filter(attrV -> {
                    return attrV.getAttrId() == attr.getId(); // 过滤条件：属性值对象的属性id == 属性对象的id
                }).collect(Collectors.toList());
                attr.setValues(aVs);  // 将过滤出来的属性值列表aVs赋值给attr属性对象的values
                return attr;
            }).collect(Collectors.toList());
            skuItem.setSpecs(attrs); // 将属性列表attrs赋值给skuitem对象的specs集合。此时的attrs中包含属性值列表
            return skuItem;
        }).collect(Collectors.toList());

        // 7、将sku列表、规格属性列表赋值给商品对象
        goods.setSkus(skuList);  // sku列表
        goods.setSpecs(goodsAttr); // 规格属性列表
        goods.setBrandItem(brandItem);  // 商品品牌
        goods.setCategories(categories); //商品类别
        return goods;
    }
}
